package com.sprouting.ops.model;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sprouting.ops.annotations.invoke.CheckIsNullOrEmpty;
import com.sprouting.ops.annotations.invoke.CheckLength;
import com.sprouting.ops.annotations.invoke.CheckNotNull;
import com.sprouting.ops.interfaces.AddGroup;
import com.sprouting.ops.interfaces.UpdGroup;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import java.util.Date;

/**
 * (应用项目表)表实体类
 *
 * @author longx
 * @since 2023-11-19 12:51:25
 */
@Data
@TableName("ops_app")
public class OpsApp extends BaseModel {

    /**
     * 主键
     */
    @CheckNotNull(message = "非法ID", groups = UpdGroup.class)
    @CheckIsNullOrEmpty(message = "无效ID", groups = AddGroup.class)
    @TableId
    private String id;
    /**
     * 图标
     * @see DromaraFileStorage#getId()
     */
    private String ico;
    /**
     * 应用名称
     */
    @CheckLength(min = 1, max = 200, message = "应用名称超过长度限制")
    @CheckNotNull(message = "请输入应用名称")
    private String name;
    /**
     * 是否公共项目
     * 公共项目可以被多个项目引用，否则只能被一个项目引用
     * @see com.sprouting.ops.interfaces.ConstantBase.YesOrNo#YES 是公共项目
     */
    private Integer common;
    /**
     * 应用状态
     * @see com.sprouting.ops.interfaces.ConstantBase.AppState
     */
    private Integer state;
    /**
     * 项目类型，前端，后端、小程序
     * @see com.sprouting.ops.interfaces.ConstantBase.AppType
     */
    @NotNull(message = "请选择项目类型")
    private Integer type;
    /**
     * 开发语言
     */
    @CheckLength(max = 255, message = "开发语言超过长度限制")
    private String language;
    /**
     * 可运行的环境 1全环境 2 win 3 linux。多个，逗号分隔
     * @see com.sprouting.ops.interfaces.ConstantBase.OsType
     */
    private String os;
    /**
     * 重要等级
     * @see com.sprouting.ops.interfaces.ConstantBase.Importance
     */
    private Integer importance;
    /**
     * 是否微服务系统
     * @see com.sprouting.ops.interfaces.ConstantBase.YesOrNo#YES 是微服务
     */
    private Integer microservices;
    /**
     * 是否分布式系统
     * @see com.sprouting.ops.interfaces.ConstantBase.YesOrNo#YES 是分布式系统
     */
    private Integer distributed;
    /**
     * 基础打包方式
     * 暂时不使用-该参数和安装 installDoc 参数重复了
     */
    @CheckLength(max = 21840, message = "打包方式超过长度限制")
    // @CheckNotNull(message = "请输入打包方式")
    private String packMethodDoc;
    /**
     * 基础部署方式
     * 暂时不使用-该参数和安装 installDoc 参数重复了
     */
    @CheckLength(max = 21840, message = "部署方式超过长度限制")
    // @CheckNotNull(message = "请输入部署方式")
    private String deployDoc;
    /**
     * 基础表结构路径
     */
    @CheckLength(max = 600, message = "表结构路径超过长度限制")
    // @CheckNotNull(message = "请输入表结构所在路径")
    private String tableUrl;
    /**
     * 项目的仓库地址
     */
    @CheckLength(max = 600, message = "项目的仓库地址超过长度限制")
    // @CheckNotNull(message = "请输入项目的仓库地址")
    private String git;
    /**
     * 应用简介
     */
    @CheckLength(max = 21840, message = "应用简介超过长度限制")
    // @CheckNotNull(message = "请输入应用简介")
    private String briefIntroduction;
    /**
     * 安装部署
     */
    @CheckLength(max = 21840, message = "安装文档超过长度限制")
    private String installDoc;
    /**
     * 项目排序
     * @see com.sprouting.ops.interfaces.ConstantBase.DefaultValue#SORT 默认值
     */
    private Double sort;

    /**
     * 项目启动时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private Date openTime;

    /**
     * 应用负责人姓名
     */
    @CheckLength(max = 150, message = "项目负责人超过长度限制")
    private String directorName;

}

